package com.briup.day14;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;

public class IOTest {
    public static void main(String[] args) {
        // 字符输入流
        try (FileReader fr = new FileReader("a.txt")) {
            // 如何保证能够将一本20万字的小说全部读取到程序中
            char[] chars = new char[1024];
            int len = -1;
            // 使用read()方法将每一次读取的字符数据放入到chars数组对象中，
            // 并且将每一次读取的字符数量赋值给变量len，在将变量len的值与-1进行比较
            // 如果read()方法的返回值是-1表示文件数据已经读取完毕
            while ((len = fr.read(chars)) != -1) {
                // 如果循环条件成立，即变量len不等于-1，那么执行循环体内的内容；
                // 因为循环条件是必然会执行的，所以每次在chars数组中的都是新读取的字符数据
                System.out.println(new String(chars, 0, len));
            }
        } catch (IOException e) {
            System.err.println("出现IO异常:" + e.getMessage());
        }
    }

    private static void test2() {
        // 字符输入流
        try (FileReader fr = new FileReader("a.txt")) {
            // 使用字符输入流读取文件中的字符数据
            // 无参的read()方法读取到的是单个字符的在字符集中的序号
            int read = fr.read();
            System.out.println(read);

            // 建议使用单参或多参的read()方法，如此就能一次性读取多个字符数据，
            // 每次将读取到的字符数据写入到你传入的字符数组中
            char[] chars = new char[1024];
            // 本次会将文件中未读取的字符数据写入到你传入的字符数组chars对象中，
            // 具体本次读取的字符数量会通过返回值返回使用len变量接收，具体读取的字符数
            // 取决于当前还剩多少字符未读取，以及你传入的字符数组的长度；
            // 如果未读取的字符数超过数组的长度，那么本次读取的就是数组长度个字符，
            // 反之就是一次性将未读取的字符全部读取完毕
            int len = fr.read(chars);
            System.out.println(Arrays.toString(chars));
            // 将char型数组转换为String字符串对象
            String s = new String(chars, 0, len);
            System.out.println(s);
        } catch (IOException e) {
            System.err.println("出现IO异常:" + e.getMessage());
        }
    }

    private static void test() {
         /*
            字符流，有别于字节流的是，每次读取的是一个字符数据，
            并且默认情况使用的是UTF-8编码格式进行读取，也可以指定其他编码格式，
            会根据编码格式调整字符编码的存储的字节，UTF-8通常表示中文是3个字节，GBK是2个字节
         */
        // 创建一个文件字符输出流
        try (FileWriter fw = new FileWriter("a.txt")) {
            // 写出数据
            fw.write("hello world;你好，世界！！！");
            // 刷新数据，将通信信道中的数据刷新到文件中
            fw.flush();
        } catch (IOException e) {
            System.err.println("出现IO异常:" + e.getMessage());
        }
    }
}
